
import MBUtils from "./mb_utils";
import MBCore from "./mb_core";
import MBDataSender from "./mb_data_sender";
import { MBSocketEvent } from "./mb_constants";

class MBAutoReLoginDaemon {
    private intervalId: any = 0;
    private AUTO_RE$LOGIN_INTERVAL: any = 3000;
    private _excuting: any = false;




    /**
    * 设置自动重新登陆时间间隔。
    *
    * @param interval {int} 时间间隔（单位：毫秒）
    */
    setAutoReloginInterval(interval: any) {
        if (MBUtils.isPositiveInteger(interval))
            this.AUTO_RE$LOGIN_INTERVAL = interval;
    };

    /**
     * 执行业务逻辑（此函数由框架内部调用，开发者无需使用）。
     *
     * @see #doSendLogin()
     * @see #onSendLogin()
     */
    excute() {
        if (!this._excuting)
            this.onSendLogin(this.doSendLogin());
    };

    /**
     * 发送登陆指令（此函数由框架内部调用，开发者无需使用）。
     *
     * @return {int} 返回指令发送结果码（见 {@link MBErrorCode} 对象中的常量定义）
     */
    doSendLogin() {
        this._excuting = true;

        if (MBCore.debugEnabled()) {
            console.log("自动重新登陆线程执行中, autoReLogin ? " + MBCore.autoReLogin + "...")
        }

        let code = -1;
        // 是否允许自动重新登陆哦
        if (MBCore.isAutoRelogin()) {
            code = MBDataSender.sendLogin(MBCore.getCurrentLoginInfo());
        }
        return code;
    };

    /**
     * 登陆指令发出后的回调处理（此函数由框架内部调用，开发者无需使用）。
     *
     * @param {int} code 前一步的指令发送结果码
     * @see #doSendLogin()
     */
    onSendLogin(code: any) {
        // 给应用层发出尝试重新登陆/连接事件通知
        MBCore.emit(MBSocketEvent.SOCKET_EVENT_RECONNECT_ATTEMPT, code);
        if (code === 0) {
        }

        this._excuting = false;
    };

    start(immediately: any) {
        this.stop();

        // 立即执行1次
        if (immediately) {
            this.excute();
        }

        let that = this;
        // 定时执行
        this.intervalId = setInterval(function () {
            that.excute();
        }, this.AUTO_RE$LOGIN_INTERVAL);
    };

    stop() {
        if (this.intervalId && this.intervalId !== 0)
            clearInterval(this.intervalId);
    };
}

export default new MBAutoReLoginDaemon();